import axios from 'axios'
import { ElMessage } from 'element-plus'
import { useUserStore } from '@/stores/user'

// 禁用特定的404错误日志
const originalConsoleError = window.console.error
window.console.error = (...args) => {
  // 检查是否是 XHR 错误日志
  const isXHRError = args[0] === '' && args[1]?.toString?.()?.includes?.('GET http')
  if (isXHRError) {
    const url = args[1]?.toString?.() || ''
    // 只过滤证书编号检查相关的404错误
    if (url.includes('/api/certificates/view/')) {
      return
    }
  }

  // 检查是否是 axios 错误日志
  const errorMessage = args[0]?.toString?.() || ''
  if (errorMessage.includes('/api/certificates/view/') && errorMessage.includes('404')) {
    return
  }

  originalConsoleError.apply(console, args)
}

// 创建 axios 实例
const service = axios.create({
  baseURL: '',  // 使用相对路径，让浏览器基于当前域名构建URL
  timeout: 5000,
  // 只允许 200-299 的状态码
  validateStatus: function (status) {
    return status >= 200 && status < 300
  },
  // 添加响应类型配置
  responseType: 'json'
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    const userStore = useUserStore()
    if (userStore.token) {
      config.headers['Authorization'] = `Bearer ${userStore.token}`
    }
    
    // 检查请求数据
    if (config.method === 'post' || config.method === 'put' || config.method === 'delete') {
      console.log('请求配置:', {
        url: config.url,
        method: config.method,
        data: config.data,
        headers: config.headers
      })
    }
    
    return config
  },
  error => {
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 如果是blob类型的响应，返回二进制数据
    if (response.config.responseType === 'blob') {
      return response.data
    }
    return response.data
  },
  error => {
    // 如果是404错误且是证书查询，直接返回
    if (error.response?.status === 404 && error.config.url.includes('/api/certificates/view/')) {
      return Promise.reject(error)
    }

    // 统一处理错误
    let message = error.response?.data?.message || error.message || '请求失败'

    // 根据状态码处理错误
    if (error.response) {
      switch (error.response.status) {
        case 401:
          if (!error.config.url.includes('/admin/login')) {
            const userStore = useUserStore()
            userStore.logout()
          }
          break
        case 403:
          // 对于403错误，直接返回错误，让业务代码处理
          return Promise.reject(new Error(error.response.data.message || '操作被禁止'))
        case 404:
          message = '请求的资源不存在'
          break
        case 500:
          message = '服务器内部错误'
          break
        default:
          message = error.response.data.message || '请求失败'
      }
    }

    // 显示错误消息（除了403以外的错误）
    if (error.response?.status !== 403) {
      ElMessage.error(message)
    }
    
    return Promise.reject(new Error(message))
  }
)

export default service
